作者:家居生活我最大_386 | 来源:互联网 | 2023-09-15 00:20
篇首语:本文由编程笔记#小编为大家整理,主要介绍了theano学习指南--混合蒙特卡洛采样(翻译)相关的知识,希望对你有一定的参考价值。欢迎fork我的github
篇首语:本文由编程笔记#小编为大家整理,主要介绍了theano学习指南--混合蒙特卡洛采样(翻译)相关的知识,希望对你有一定的参考价值。
欢迎fork我的github:https://github.com/zhaoyu611/DeepLearningTutorialForChinese
最近在学习Git,所以正好趁这个机会,把学习到的知识实践一下~ 看完DeepLearning的原理,有了大体的了解,但是对于theano的代码,还是自己撸一遍印象更深 所以照着deeplearning.net上的代码,重新写了一遍,注释部分是原文翻译和自己的理解。 感兴趣的小伙伴可以一起完成这个工作哦~ 有问题欢迎联系我 Email: zhaoyuafeu@gmail.com QQ: 3062984605
理论
能量模型的最大化似然函数需要一个鲁棒算法对负项进行采样。(见 Restricted Boltzmann Machines (RBM)的公式4)。当使用CD或PCD训练RBms时,通常使用块Gibbs采样,其中条件分布
p(h|v)
和
p(v|h)
是马尔科夫链的转换操作。
然而在某些情况下,这些条件分布难以采样(例如RBM的均方差,逆矩阵)。同样,即使能够有效的Gibbs采样,由于它采用随机采样,所以对某些分布效果可能不理想。本文中,当从连续变量中采样时,可以证明混合蒙特卡洛法(HMC)是一种有效的工具[Duane87]。它模仿物理系统中的密尔顿动力学,从而较好了解决了条件分布的采样过程。
在HMC,模拟物理系统进行采样。物理系统中粒子拥有势能和动能,从而在高维空间运动。根据 [Neal93]提出的概念,粒子可以通过位置矢量(或状态矢量
s∈RD
)和速度矢量
ϕ∈RD
。粒子的组合态表示为
χ=(s,ϕ)
。汉密尔顿定义为势能
E(s)
(能量模型使用同样的能量函数)和动能的总和。定义如下:
相比直接采样
p(s)
,HMC从正则分布
采样。因为两个变量是相互独立的,边缘化的
ϕ
是原始分布无重要影响。
汉密尔顿动力学
在仿真环境中,即使状态量
ϕ
和速度量
ϕ
发生变化,
H(s,ϕ)
也会保持不变。微分方程如下:
(1)
[Neal93]指出,上述变换是可逆的。上述动力学方程可以看做是马尔科夫链的变形,但
p(s,ϕ)
是保持不变的。链本身不会变化,因为仿真动力学方程会保持固定的汉密尔顿函数
H(s,ϕ)
。HMC在汉密尔顿动力学函数和速度的Gibbs采样中交替进行。因为
p(s)
和
p(ϕ)
相互独立,所以无须进行
ϕnew∼p(ϕ|s)
,因为
p(ϕ|s)=p(ϕ)
,通常
p(ϕ)
是单变量高斯分布。
蛙跳算法
事实上,由于研究的问题是时间离散的,所以我们无法精确的计算汉密尔顿动力学方程。这里有若干解决途径。为了保持马尔科夫链的不变性,必须保持容积恒定和时间可逆的属性。蛙跳算法保持这些属性,并执行三步操作:
(2)
在时刻
t+ϵ/2
我们执行半步速度更新,来计算
s(t+ϵ)
和
ϕ(t+ϵ)
。
接受/拒绝
事实上,有限步长
ϵ
不能精确的保证
H(s,ϕ)
恒定,所以引入偏置的概念。另一方面,浮点数的舍入误差意味着变换过程并不是完全可逆的。
HMC在
n
步蛙跳后,引入了接受/拒绝阶段。新状态量χ′=(s′,ϕ′)以概率
pacc(χ,χ′)
接受。
pacc(χ,χ′)
定义为:
HMC算法
本教程中,获得新的HMC样本方法如下:
- 根据单变量高斯分布采样新的速度
- 执行
n
步蛙跳获得新的状态量χ′ - 对
χ′
执行接受/拒绝
使用Theano运行HMC
在Theano中,更新字典和共享变量为执行采样算法提供了最自然的方法。样本当前状态量可以用Theano共享变量表示,而HMC的更新列表通过Theano的更新函数获得。
将HMC算法分解为以下子组件:
- simulate_dynamics:Python符号函数,输入为初始位置和速度,执行
n_step
蛙跳更新,并返回符号变量:计算的状态量
χ′
。 - hmc_move:Python符号函数,输入为起始位置,随机采样速度矢量,生成状态量
χ
。然后调用simulate_dynamics函数,决定是否接受从
χ→χ′
的转换。 - hmc_updates:Python函数,输入为hmc_move的符号输出量,输入为一次HMC过程的更新列表。
- HMC_sampler:Python类,整合上述函数
simulate_dynamics
为了执行
n
步蛙跳采样,我们这里定义一个函数便于Scan函数的使用。不同于公式(2),我们可以对ϕ执行前半步更新,然后对
s
和ϕ执行
n
步更新,对ϕ执行后半步更新,从而获得
s(t+nϵ)
和
ϕ(t+nϵ)
。对于循环形式,可以写做:
(3)
公式中内循环是通过执行leapfrog函数实现的,其中分别用
pos,ve
var cpro_id = "u6885494";